Virtual  Machine

가상머신(Virtual Machine)
하나의 하드웨어(CPU, Memory등)에 다수의 운영체제를 설치하고, 개별 컴퓨터처럼 동작하도록 하는 프로그램
가상 머신(Virtual Machine) : 네이버 블로그
Virtual Machine Type1(native or bare metal)
하이퍼 바이저(또는 VMM): 운영체제와 응용프로그램을 물리적 하드웨어에서 분리하는 프로세스
하이퍼바이저 또는 버추얼 머신 모니터(VMM라고 하는 소프트웨어가 Hardware에서 직접 구동
    Xen, KVM
Virtual Machine Type2
하이퍼바이저 또는 버추얼 머신 모니터(VMM)라고 하는 소프트웨어가 Host OS 상위에 설치
    VMWare, Parallels Desktop(Mac)
Hypervisor Type 1 and Type 2 - Windows 10 Forums
Full Virtualization(전가상화) Half Virtualization(반가상화)
전가상화: 각 가상머신이 하이퍼바이저를 통해서 하드웨어와 통신
    하이퍼바이저가 마치 하드웨어인 것처럼 동작하므로, 가상머신의 OS는 자신이 가상 머신인 상태인지 모름
    (Hypervisor, VMM)은 하드웨어와 Virtual Machine 사이의 인터페이스를 담당)

반가상화: 각 가상머신에서 직접 하드웨어와 통신
    각 가상머신에 설치되는 OS는 가상 머신인 경우, 이를 인지하고, 각 명령에 하이퍼바이저 명령을 추가해서 하드웨어와 통신
    (Hypervisor, VMM)은 자원(resource) 관리를 담당)

반가상화가 성능상 더 속도가 빠름 하지만, OS를 가상머신을 위해 명령을 수정해야 하므로, 복잡도가 증가
최근 HW 성능 개선으로 전가상화 기술이 더욱 선호된다.(보통은 두 기술 다 사용)
Virtual Machine examples
VMWare: 대중적인 가상머신 프로그램(Type2)

KVM: AWS(Amazon Web Services)등에서 사용(Type1)
    Amazon에서 제공해주는 서버시스템은 실제 컴퓨터 하나가 아닌 컴퓨터 위에서 운영되는 가상 머신 운영체제
KVM(Linux Kernel) Progress
Linux에서 ioctl() 시스템콜을 이용하면 직접적으로 하드웨어를 제어하는 것이 가능함
ioctl()을 통해서 CPU에 가상 CPU(vCPU)를 만들어 달라고 요청할 수 있다.
Intel은 가상화 기능을 가진 Intel-VT(가상 CPU 명령어 셋) 등 CPU에서는 VMX root/VMX non-root등 모드가 존재한다.
위의 기능을 이용해서 KVM이라는 소프트웨어를 제작

VMX root/VMX non-root 각 모드별로 protection ring 0~3 지원, 가상화 기능을 상용하지 않을 경우 VMX root모드 사용
KVM 각 가상 시스템에 대응하는 KVM 프로세스 실행, KVM 모듈(/dev/kvm)을 통해서 vCPU 사용
KVM 프로세스 기반 게스트 커널(VMX non-root/ RING0 0 사용), QEMU 장치 에뮬레이터가 로드된다.
게스트 커널 위에서 실행되는 응용 프로그램은 VMX non-root/ RING 3 사용
게스트 커널이 물리적 HW 자원 필요시, VM exit(인터럽트)가 발생, KVM 모듈에서 해당 요청 처리
일반 HW 자원은 QEMU 장치 에뮬레이터에서 처리
    QEMU 장치 에뮬레이터는 VMX root/ RING 3를 통해, 호스트 커널에 요청한 후, 해당 데이터는 공유 메모리를 통해
    KVM 게스트 커널과 공유
Docker(가상 머신 vs Docker)
가상 머신은 컴퓨터 하드웨어를 가상화(하드웨어 전체 추상화)
    하이퍼바이저 사용, 추가 OS필요 등 성능 저하 이슈 존재
Docker는 운영체제 레벨에서 별도 분리된 실행환경을 제공(커널 추상화)
    마치 리눅스를 처음 설치했을 때와 유사한 실행환경을 만들어주는 리눅스 컨테이너 기술 기반
    리눅스 컨테이너 기술이므로 macOS나 windows에 설치할 경우는 가상 머신 기반 제공

리눅스에서 chroot 시스템콜을 통해서 운영레벨에서 별도로 분리된 실행환경을 만들 수 있다.(root, file등 모두 따로 존재)
==리눅스 컨테이너 기술

Bare-Metal(type1) 방식이 가장 성능이 좋다
    하드웨어 직접 엑세스하기 때문ㅇ
    AWS(클라우드 컴퓨팅) 환경도 Bare-Metal 기반 가상 머신 기술 활용(KVM)
Docker는 경량 이미지로 실행환경을 통째로 백업, 실행가능(실무에 많이 활용)
(별도의 운영체제가 필요없음, 리눅스가 있다면)
    Data Engineering에서 Docker로 시스템 환경 설정+프로그램을 한번에 배포
ex) 프로그램 업데이트 -> Docker 이미지 작성 -> Jenkins로 배치잡 생성 및 실행(AWS EC2  재생성 및 Docker 이미지 설치, 실행)
참고) Docker example
Docker 로 운영체제/프로그램 이미지로 관리
docker pull ubuntu: latest
docker images
docker run -i -tname hello ubuntu /bin/bash
docker start hello
docker restart hello
docker attach hello
Java Virtual Machine
가상 머신과는 다른 목적(응용프로그램 레벨 가상화)
Java 컴파일러는 CPU dependency를 가지지 않는 bytecode를 생성한다.
이 파일은 Java Virtual Machine에서 실행
각 운영체제를 위한 Java Virtual Machine 프로그램 존재